#include "common.h"
#include <unistd.h>
#include <sys/mman.h>
#include <stdio.h>

static unsigned char *g_cc_base;
static size_t g_cc_size;
static size_t g_cc_used;

void *mc_code_cache_alloc(size_t size)
{
    size = (size + 15) & ~((size_t)15);
    if (!g_cc_base || g_cc_used + size > g_cc_size) {
        size_t pagesz = (size_t)sysconf(_SC_PAGESIZE);
        size_t alloc = (size + pagesz - 1) & ~(pagesz - 1);
        void *p = mmap(NULL, alloc, PROT_READ | PROT_WRITE | PROT_EXEC,
                       MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
        if (p == MAP_FAILED) {
            perror("mmap code cache");
            return NULL;
        }
        g_cc_base = (unsigned char *)p;
        g_cc_size = alloc;
        g_cc_used = 0;
    }
    void *out = g_cc_base + g_cc_used;
    g_cc_used += size;
    return out;
}

void mc_clear_icache(void *start, void *end)
{
#if defined(__aarch64__)
    __builtin___clear_cache((char *)start, (char *)end);
#elif defined(__x86_64__)
    // x86_64 指令缓存一致性由硬件保证，这里空实现
    (void)start; (void)end;
#else
    (void)start; (void)end;
#endif
}

int dbi_init(void)
{
    // 目前代码缓存按需分配，无需提前初始化。
    // 如后续需要更多初始化（例如符号解析、映射表等），可在此扩展。
    return 0;
}

